#include "../tools.h"


/**
 * 注意：！！！优先级队列的排序规则设置与其他容器相反：返回 true 的在后面
 * 注意：priority_queue中默认使用less<T>判断式比较元素大小，因此可以使用对Node类型数据进行 < 符号的重载
 * 注意：
 * 
 * 自定义排序规则：
 * 1 重载数据结构的 operator<大顶堆、operator>小顶堆 - 自定义数据结构时使用
 * 2 使用函数对象
 * 3 使用 lambda 表达式、函数指针
 * 
 * 第一个元素升序，第二个元素降序排列
 */
class cmp{
public:
    bool operator()(const pair<int, int>& a, const pair<int, int>& b){
        return a.first != b.first ? a.first > b.first : a.second < b.second;
    }
};

struct node{
    int first;
    int second;
    bool operator<(const node& n) const { // 大顶堆定义operator<，返回 true 的在后面
        return first != n.first ? first > n.first : second < n.second;
    }
};

int main(int argc, char const *argv[])
{
    vector<pair<int, int>> vec = {{3,4}, {1,2}, {2,3}, {3,8}, {9,3}, {3,5}};

    priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> qMax;

    input(vec, qMax);
    show(qMax);
    cout << endl;

    vector<node> vec2 = {{3,4}, {1,2}, {2,3}, {3,8}, {9,3}, {3,5}};

    priority_queue<node> qMax2;

    for(auto& e: vec2) qMax2.push(e);
    while(!qMax2.empty()) cout << qMax2.top().first << " " << qMax2.top().second << endl, qMax2.pop();

    return 0;
}
